package com.zhh.springcloud.controller;

import com.zhh.springcloud.model.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.List;

//消费者层的controller
@RestController
@RequestMapping("/consumer")
public class DeptConsumerController {
    //消费者模块没有service层
    //我们可以使用RestTemplate类中提供的方法来实现。其具体作用就是，通过url和参数，调用消费者的http服务，以实现本层的controller方法

    @Autowired
    private RestTemplate restTemplate;

    //RestTemplate请求服务提供者的controller层地址的前缀
    //private static final String REST_URL_PREFIX = "HTTP://localhost:8001/";
    //在负载均衡算法中，需要将上述的url改成动态地址，即eureka中的注册服务端注册名（一个注册名可能对应多个服务提供者）
    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT/";

    @GetMapping("/get")
    public Department get(@RequestParam(value = "id", required = false) int id){
        String url = REST_URL_PREFIX + "/provider/get?id={id}";   //把服务提供者所对应的请求类型所对应的url写出来，对应的参数用map存
        HashMap<String, Integer> paramMap = new HashMap<>();
        paramMap.put("id",id);           //把参数放进map中
        return restTemplate.getForObject(url, Department.class, paramMap);
    }
    /*
        restTemplate.getForObject的方法通常有三个参数，一个是url地址;一个是map，用来存放url地址的请求参数（通常以key作为变量名，value作为变量值）;
        第三个参数则是调用返回值的class对象
        详情可参考：https://www.cnblogs.com/felordcn/p/12719139.html
     */

    @GetMapping("/getall")
    public List<Department> getall(){
        String url = REST_URL_PREFIX + "/provider/getall";
        return restTemplate.getForObject(url, List.class);
    }

    @PostMapping("/add")
    public Integer add(@RequestBody Department department){
        String url = REST_URL_PREFIX + "/provider/add";
        return restTemplate.postForObject(url, department, Integer.class);
        // 如上所示：我们的post请求中，其中输入参数也可以不是map，可以直接是我们的参数类
    }

    @GetMapping("delete")
    public int delete(@RequestParam(value = "id", required = false) int id){
        String url = REST_URL_PREFIX + "/provider/delete?id={id}";
        HashMap<String, Integer> paramMap = new HashMap<>();
        paramMap.put("id", id);
        return restTemplate.getForObject(url, Integer.class, paramMap);
    }

    @PostMapping("/modify")
    public int modify(@RequestBody Department department){
        String url = REST_URL_PREFIX + "/provider/modify";
        return restTemplate.postForObject(url, department, Integer.class);
    }


}
